home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 001-010 / amok02 / iffload / iffload.doc < prev    next >
Text File  |  1993-11-04  |  14KB  |  313 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    IFFLoad.mod
  3.     :Author.     Fridtjof Siebert
  4.     :Address.    Nobileweg 67, D-7-Stgt-40
  5.     :Phone.      0711/822509
  6.     :Shortcut.   [fbs]
  7.     :Version.    1.0
  8.     :Date.       24-May-88, 02:34:40 (!)
  9.     :Copyright.  PD or Shareware, anyway you like (I like Shareware better).
  10.     :Language.   Modula-II
  11.     :Translator. M2Amiga
  12.     :Imports.    none.
  13.     :UpDate.     none.
  14.     :Contents.   Ladeprozedur für IFF (ILBM)-Bilder.
  15.     :Remark.     Thanks to Pit and Frank for their ideas to load to BitMap
  16.     :Remark.     and to open a Window.
  17. ---------------------------------------------------------------------------*)
  18.  
  19. Mit der von IFFLoad exportierten Procedure können IFF-Bilder geladen
  20. werden. Dabei wird das geladene Bild als Screen geöffnet. Das Bild kann
  21. optional im Hintergrund geladen werden, d.h. der Screen wird beim Öffnen
  22. nicht nach vorne, sondern nach hinten gelegt. Das Display (die
  23. Bildschirm-DMAs) können während dem Laden abgeschaltetet werden. Das erhöht
  24. die Geschwindigkeit. Gepackte Bilder werden entpackt. Beim Laden von
  25. HAM-Bildern wird das ham-Bit in den ViewModes gesetzt.
  26.  
  27. ------  Laden von IFF-Bildern:  ------
  28.  
  29. Das Programm ShowIFF lädt und zeigt ein IFF-Bild. Es lädt das vorher auf
  30. der Workbench angeklickte oder, beim starten vom CLI, das hinter dem Namen
  31. angegebene Bild. Bilder, die ShowIFF als Default-Tool haben (Info), können
  32. durch einfachen Doppelklick gezeigt werden. An diesem kurzen Programm kann
  33. man leicht die verwendung der Ladeprozedur studieren.
  34.  
  35. ------  Aufruf der LadeProzedur:  ------
  36.  
  37. IFF-Bilder können mit ReadILBM() aufgerufen werden. Dazu muß man ReadILBM,
  38. ReadILBMFlags und ReadILBMFlagSet von IFFLoad Importieren. Die Syntax sieht
  39. folgendermaßen aus:
  40.  
  41. ReadILBM(name: ARRAY OF CHAR; Flags: ReadILBMFlagSet; VAR Screen: ScreenPtr;
  42.          VAR Window: WindowPtr): BOOLEAN;
  43.  
  44. name: Name der Grafik, evt. mit Pfad (z.B. "df0:Bilder/Meins.iff")
  45.  
  46. Flags: folgende Flags können gesetzt werden:
  47.    - front:    Der Screen, in den die Grafik geladen wird, wird vor (gesetzt)
  48.                oder hinter (front nicht gesetzt) alle anderen Screens gelegt.
  49.    - visible:  Wenn visible nicht gesetzt ist, wird das Display mit
  50.                GfxMarcos.OffDisplay() während dem Laden ausgeschaltet, um
  51.                die Geschwindigkeit, besonders bei Bildern mit vielen Planes,
  52.                zu erhöhen.
  53.    - dontopen: Wenn dontopen gesetzt ist, wird kein Screen geöffnet. Die
  54.                Grafik steht dann in IFFLoad.NuScreen.customBitMap (s.u.).
  55.                Der zurückgegebene ScreenPtr ist dann NIL.
  56.    - window:   Wenn gesetzt, wird in dem Screen ein Window mit der größe
  57.                der Grafik geöffnet. Dann kann man später noch Gadgets,
  58.                Menüs etc. hinzufügen. Anderenfalls (nicht gesetzt) wird als
  59.                WindowPtr NIL zurückgegeben.
  60.  
  61. Screen/Window: Zeiger auf geöffneten Screen/Window oder NIL.
  62.  
  63. Ergebnis: FALSE, wenn ein Fehler auftrat.
  64.  
  65. ------  Informationen zum Bild:  ------
  66.  
  67. Man braucht, um IFF-Bilder zu laden, eigentlich keine Ahnung von
  68. IFF-Dateien haben. Wer jedoch Interesse an den genauen geladenen Werten
  69. hat, der kann die Variable IFFInfo importieren. Sie enthält ein großes
  70. verschachtelte RECORD. Vorsicht beim Laden von mehreren Bildern !!!
  71. IFFInfo wird bei jedem Laden überschrieben. Man sollte dann den Typ
  72. IFFInfoType importieren und IFFInfo in eigene Variablen kopieren.
  73.  
  74. ------  Laden in BitMap:  ------
  75.  
  76. Es ist möglich, beim Laden keinen Screen zu öffnen. Dies geschieht beim
  77. Aufruf von ReadILBM durch die Option `dontopen'. Es wird eine BitMap-
  78. Struktur angelegt, die die Bilddaten enthält. Sie befindent sich in
  79. NuScreen.customBitMap^ (NuScreen importiert). Der Screen kann nachträglich
  80. mit OpenScreen(NuScreen) geöffnet werden. Danach muß man jedoch die
  81. Farben mit (sie stehen in IFFInfo.CMAP) mit SetRGB4() setzen. Vorsicht !!!
  82. Bei `dontopen' muß der Speicher für die Grafikdaten und die BitMapstruk-
  83. tur zurückgegeben werden! Eine BitMap ist normalerweise so groß wie die vom
  84. IFF-File angegeben Screengröße. Ist dies jedoch kleiner, oder nur die
  85. Breite oder nur die Höhe kleiner als die Des Bildes selbst, so wird die
  86. BitMap auch entsprechend größer. Dies gilt auch für einen Screen, wenn
  87. dontopen nicht gesetzt ist !
  88. Ein Beispielprogramm dafür ist IFFBitMapDemo.
  89.  
  90. ------  ColorCycling:  ------
  91.  
  92. Von IFFLoad können auch noch die Prozeduren DoCycle() und EndCycle()
  93. importiert werden. Durch Sie kann man Colorcycling ein- bzw. ausschalten.
  94. Es wird ein Interrupt so initialisiert, daß er daß Cycling vollständig
  95. übernimmt. Wie man die Prozeduren handhabt kann man dem Programm
  96. ShowCycle.mod entnehmen. Es entspricht dem Programm ShowIFF, nur für
  97. Cycling-Bilder. Leider ist nicht bei allen nicht-Cycling Bilder das Color-
  98. Cycling korrekt ausgeschaltet, so daß man diese nicht mit ShowCycle zeigen
  99. kann (kein Guru, aber die Farben wandern !!!).
  100.  
  101. ------  DiaShow:  ------
  102.  
  103. Das Programm DiaShow zeigt mehrere Bilder nacheinander an. Alle Bilder, die
  104. gezeigt werden sollen, müssen vorher mit gedrückter SHIFT-Taste ausgewählt
  105. werden. Danach kann man DiaShow mit Doppelklick starten (SHIFT nicht
  106. vergessen). Die Bilder werden nacheinander ein- und ausgeblendet. Der
  107. Zeitabstand zwischen 2 Bilder beträgt 20 Sekunden. Vorher kann man mit der
  108. rechten Maustaste das nächste Bild ansehen, wenn dieses bereits geladen
  109. ist.
  110.  
  111. Wenn man DiaShow vom CLI aus startet, kann man die Bilder auch
  112. unterschiedlich lang zeigen lassen. Die Anzeigadauer gibt man jeweils nach
  113. dem Bildnamen an. Sie gilt auch für die dahinter folgenden Bilder.
  114.  
  115. Beispiel: DiaShow Bild1 10 Bild2 30 Bild3 Bild4 20
  116.  
  117. Bild1 wird 10, Bild2 und Bild3 30 und Bild4 20 Sekunden lang gezeigt.
  118.  
  119. ------  Copyright:  ------
  120.  
  121. Das Modul kann von jedem in nicht kommerziellen Programmen frei verwendet
  122. werden. Wer genügend Geld hat, der kann einem armen Schüler (mir !) auch
  123. eine Sharewaregebühr zukommen lassen. Mein ewiger Dank ist Ihm dann gewiß !
  124.  
  125. Bevor ein Programm, das dieses Modul benutzt kommerziell genutzt wird
  126. (Veröffentlicht wird), muß sich der Autor mit mir in Verbindung setzten und
  127. eine eventuelle Vergütung aushandeln.
  128.  
  129. ------  IFF für jedermann und jedefrau:  ------
  130.  
  131. Da das IFF-Format fast nirgends gut erklärt wird, möchte ich
  132. versuchen, wenigsten zum Bildformat eine einigermaßen brauchbare
  133. Beschreibung zu geben.
  134.  
  135. ------  Das IFF-Bildformat:  ------
  136.  
  137.   allgemeines:
  138.     Eine IFF-Datei beginnt mit der Kennung "FORM". Darauf folgt die
  139.     Länge der des Datenblocks.
  140.     Der Datenblock enthält dann die Kennung der Daten. Bei Bildern ist
  141.     sie "ILBM".
  142.     Darauf folgen beliebig viele Unterdatenblöcke. Sie beginnen
  143.     jeweils mit 4 Bytes, die die Daten Kennzeichnen. Ihnen folgt ein
  144.     Langwort, das wieder die Länge des Datenblocks angibt.
  145.  
  146.   Der Aufbau einer ILBM-Datei (vor dem Doppelpunkt jeweils die Nummer
  147.   des Bytes):
  148.  
  149.     0  :  "FORM"       -->  Kennzeichnet IFF-Datei.
  150.     4  :  LONGCARD     -->  Länge des Datenblocks, entspricht
  151.             Filelänge-8, da Daten beim 8. Byte beginnen.
  152.     8  :  "ILBM"       -->  Kennzeichnet Grafikdatei. (interleaved Bitmap)
  153.     12 :  Unterblock 1 -->  Die verschiedenen Daten.
  154.     x  :  Unterblock 2
  155.     y  :  etc.
  156.  
  157.   Die Unterblöcke:
  158.  
  159.     "BMHD", BitMapHeader:
  160.  
  161.        0  : "BMHD"       --> Kennung des Blocks.
  162.        4  : LONGCARD(20) --> Länge der Daten: 20 Bytes.
  163.        8  : CARDINAL(dx) --> Breite der Grafik.               (*)
  164.        10 : CARDINAL(dy) --> Höhe der Grafik.                 (*)
  165.        12 : INTEGER(x)   --> x-Position der Grafik (LeftEdge)
  166.        14 : INTEGER(y)   --> y-Position der Grafik (TopEdge)
  167.        16 : UBYTE(Depth) --> Anzahl der Bitplanes             (*)
  168.        17 : UBYTE(Masking) --> Maske für Grafik. Normalerweise keine (0).
  169.               1: Maske vorhanden , dann enthält "BODY" eine zusätz-
  170.                  liche Bitplane mit der Maske. Dies muß dann auch geladen
  171.                  werden.                                       (*)
  172.               2: Durchsichtige Farbe , dann steht in TransparentColor
  173.                  eine Farbnummer, die als durchsichtig gelten soll.
  174.               3: Eine Maske kann erzeugt werden, indem man eine Art Lasso um
  175.                  das Image wirft. Dazu zieht man eine Linie außen um das
  176.                  Image und füllt den Innenraum von diesem Rand mit
  177.                  transparentColor aus. Alles, was danach die Farbe
  178.                  transparentColor hat, ist durchsichtig.
  179.        18 : UBYTE(Compression) --> 0: Daten nicht gepackt     (*)
  180.                                    1: Daten gapackt, siehe "BODY"
  181.        19:  UBYTE(0)     --> nicht benutzt, muß 0 sein.
  182.        20:  CARDINAL(transparentColor) --> Durchsichtiga Farbe, siehe
  183.               Making.
  184.        22:  UBYTE(xAspect), UBYTE(yAspect) --> Verzerrung des Bildes.
  185.                          bei 320x200 normalerweise 10:11.
  186.        24:  INTEGER(dx)  --> Breite des Screens.
  187.        26:  INTEGER(dy)  --> Höhe des Screens.
  188.  
  189.        mit (*) gekennzeichnete müssen berücksichtigt werden.
  190.  
  191.     "CMAP", ColorMap:
  192.  
  193.        0  : "CMAP"       --> Kennung des Blocks.
  194.        4  : LONGCARD(x)  --> Länge des Blocks, entspricht der Zahl der
  195.               Farben durch drei. Gewöhnlich ist die Anzahl der Farben
  196.               gerade, weshalb kein Füllbyte eingefügt werden muß.
  197.        8  : UBYTE(Red)   --> Rotanteil Farbe 0
  198.        9  : UBYTE(Green) --> Grünanteil
  199.        10 : UBYTE(Blue)  --> Blauanteil
  200.        11 : UBYTE(Red)   --> Rotanteil Farbe 1
  201.        12 : etc.
  202.        x+7: UByte(Blue)  --> Blauanteil Farbe (x DIV 3)
  203.  
  204.     "GRAB" definiert einen besonderen Punkt (hot spot) in der Grafik.
  205.  
  206.        0  : "GRAB"       --> Kennung.
  207.        4  : LONGCARD(4)  --> Länge 4 Bytes.
  208.        8  : INTEGER(x)   --> x-Position des markierten Punktes
  209.        10 : INTEGER(y)   --> y-Position
  210.  
  211.     "DEST", destination:
  212.        gibt an, in welche Bitplanes die GrafikDaten geschrieben werden.
  213.  
  214.        0  : "DEST"       --> Kennung.
  215.        4  : LONGCARD(8)  --> Länge
  216.        8  : UBYTE(Depth) --> Anzahl Planes in Quell-Grafik
  217.        9  : UBYTE        --> Füllbyte, 0.
  218.        10 : CARDINAL(PlanePick)  --> siehe Intuition Ref. Manual, S.192 ff
  219.        12 : CARDINAL(PlaneOnOff)
  220.        14 : CARDINAL(PlaneMaks)  --> zum schreiben benutzte Bitplanes.
  221.  
  222.     "CAMG", gibt besondere ViewModes an:
  223.  
  224.        0  : "CAMG"
  225.        4  : LONGCARD(4)
  226.        8  : LONGSET(ViewMode) --> Entspricht nicht (!) ViewModeSet{}.
  227.                  { 2} : Interlace
  228.                  {10} : BoublePlayField
  229.                  {17} : Hold and Modify
  230.                  {31} : hires
  231.  
  232.     "CRNG", für Colorcycling:
  233.  
  234.        0  : "CRNG"
  235.        4  : LONGCARD(8)
  236.        8  : INTEGER       --> 0, nicht benutzt.
  237.        10 : INTEGER(rate) --> Geschwindigkeit 60 je sec = 8000H
  238.                           -->   30 je sec: 4000H, 1 pro sec: 8000H DIV 60...
  239.        12 : INTEGER       --> eingeschaltet: ungleich 0
  240.        14 : UBYTE(low)    --> unterste und
  241.        15 : UBYTE(high)   --> oberste Grenze der Farbe.
  242.  
  243.     "BODY", enthält die eigenlichen Bilddaten:
  244.  
  245.        0  : "BODY"
  246.        4  : LONGCARD(x)  --> Länge (Höhe*Breite*Tiefe/8)
  247.        8  : Daten.    Je nachdem, ob in "BMHD" Compressed gewählt
  248.                       wurde, gepackt oder nicht.
  249.  
  250.        ungepackte BitMapDaten:
  251.  
  252.            Daten der Reihe nach gespeichert: Zuerst 1. Zeile 1.
  253.            Bitplane, dann 1. Zeile 2. Bitplane etc. Danach 2. Zeile 1.
  254.            Bitplane etc.
  255.  
  256.        gepackte BitMapDaten:
  257.  
  258.            gepackt wird nur innerhalb einer Zeile. Die Zeilen sind der
  259.            Reihe nach wie bei ungepackt gespeichert.
  260.            Gepackt wird Byteweise:
  261.            Ist ein Byte
  262.            0..127  : bedeutet das: Die nächsten n+1 (1..128) Bytes
  263.                      unverändert in die Grafik laden.
  264.            129..255: Das folgende Byte wird 257-n mal in die Grafik
  265.                      kopiert.
  266.            128     : keine Funktion.
  267.  
  268.     weitere Datenblocks:
  269.       "SPRT"    für Sprites
  270.       "CCRT"    Graphiccraft: Colorcycling
  271.       "CMHD"    Graphiccraft (???)
  272.       "DPPV"    Graphiccraft (???)
  273.  
  274.       ein Ladeprogramm sollte Daten, die unbekannte Kennungen haben,
  275.       einfach überlesen. Die Länge steht ja jeweils im folgenden
  276.       Landwort.
  277.  
  278.   Ein ILBM-File muß die Blocks "BMHD" und "BODY" enthalten. "CMAP"
  279.   sollte vorhanden sein. Alle anderen sind optional.
  280.  
  281. Beispiel:
  282.   0000: 464F524D 0000567A 494C424D 424D4844    FORM..VzILBMBMHD
  283.   0010: 00000014 014000C8 00000000 05020100    .....@..........
  284.   0020: 00020A0B 014000C8 434D4150 00000060    .....@..CMAP...`
  285.   0030: 00000090 10000000 00200020 30003040    ......... . 0.0@
  286.   0040: 10305010 40602050 70305080 4060A050    .0P.@` Pp0P.@`.P
  287.   0050: 70B06070 C07080D0 9090E0A0 A0F0C0C0    p.`p.p..........
  288.   0060: F06020D0 5020B040 10903010 60301040    .` .P .@..0.`0.@
  289.   0070: 20103000 000000B0 0000A000 00A00000     .0.............
  290.   0080: A00000A0 0000A000 00A00000 A00000A0    ................
  291.   0090: 44505056 00000068 00000000 00000000    DPPV...h........
  292.   00A0: 01680000 014000C8 0002005A 00020000    .h...@.....Z....
  293.   00B0: 00020000 00020000 00000000 00000000    ................
  294.   00C0: 00000000 00000000 00000000 00000000    ................
  295.   00D0: 00000000 00000000 00000000 00010002    ................
  296.   00E0: 00000000 00000000 00000000 00010002    ................
  297.   00F0: 00000000 00000000 00000000 00010002    ................
  298.   0100: 43524E47 00000008 19961800 0002020F    CRNG............
  299.   0110: 43524E47 00000008 29304E78 00039D26    CRNG....)0Nx...&
  300.   0120: 43524E47 00000008 DD41AB4A FFFFFFF7    CRNG.....A.J....
  301.   0130: 43524E47 00000008 0047FFF4 00000001    CRNG.....G......
  302.   0140: 424F4459 00005539 11043336 01EFDC3F    BODY..U9..36...?
  303.   0150: DCC00000 0161000D FFFF40F9 00026130    .....a....@...a0
  304.   0160: 03FE0004 B5C0C890 E1FE0011 FDC337FF    ..............7.
  305.  
  306.   Dies ist ein Beispiel für eine Lores-Grafik mit der Auflösung 320
  307.   mal 200 (14H: 0140H; 16H: 0C8H). Die Tiefe beträgt 5 Bitplanes
  308.   (1CH), deshalb besteht sie aus 32 Farben (in 2CH steht 60H, durch 3
  309.   also 20H=32). Die Daten in DPPV sollten überlesen werden. Die 4 CRNG
  310.   Blöcke sind meist auch unwichtig.
  311.  
  312. -- Fridtjof.
  313.